
package Funcoes;

/**
 * @author André Caglianone
 * @version 1.0
 */
public class Emprestimo
{
    private static final int IDADE_MIN_HOMEM = 18;
    private static final int IDADE_MAX_HOMEM = 56;
    private static final int IDADE_MIN_MULHER = 18;
    private static final int IDADE_MAX_MULHER = 51;
    private static final double SALARIO_MIN = 0.0;
    private static final double SALARIO_MAX = 10000.00;

    /**
     * Calcula o valor máximo concedido para empréstimo, de acordo com a faixa etária e o sexo da pessoa
     * @author          André Caglianone
     * @param pessoa    Pessoa que deseja receber o empréstimo
     * @return          O valor que a pessoa poderá retirar de empréstimo
    */
    public double calculaValorMaximo(Pessoa pessoa)throws EmprestimoException
    {
        return (pessoa.getSexo() == Sexo.MASCULINO) ? valorMaximoHomem(pessoa.getIdade(), pessoa.getSalario())
                                                    : valorMaximoMulher(pessoa.getIdade(), pessoa.getSalario());
    }

    private double valorMaximoHomem(int idade, double salario) throws EmprestimoException
    {
        podeReceberEmprestimo(IDADE_MIN_HOMEM, IDADE_MAX_HOMEM, idade, salario);

        double valorEmprestimo = 0;
        
        if(idade <= 35)
            valorEmprestimo = (salario > 5000) ? salario * 0.75 : salario * 0.7;
        else if(idade <= 45)
            valorEmprestimo = (salario > 6000) ? salario * 0.6 : salario * 0.55;
        else
            valorEmprestimo = salario * 0.3;

        return valorEmprestimo;
    }

    private double valorMaximoMulher(int idade, double salario) throws EmprestimoException
    {
        podeReceberEmprestimo(IDADE_MIN_MULHER, IDADE_MAX_MULHER, idade, salario);
     
        double valorEmprestimo = 0;

        if(idade <= 30)
            valorEmprestimo = salario * 0.7;
        else if(idade <= 40)
            valorEmprestimo = salario * 0.5;
        else
            valorEmprestimo = salario * 0.35;

        return valorEmprestimo;
    }

    private void podeReceberEmprestimo(int idadeMinima, int idadeMaxima, int idadePessoa, double salarioPessoa) throws EmprestimoException
    {
        validaIdade(idadeMinima, idadeMaxima, idadePessoa);
        validaSalario(salarioPessoa);
    }

    private void validaIdade(int idadeMinima, int idadeMaxima, int idadePessoa) throws EmprestimoException
    {
        if(idadePessoa < idadeMinima)
        {
            throw new EmprestimoException("Idade inválida! A idade é menor do que a mínima permitida - Idade Mínima: " + idadeMinima);
        }
        else if (idadeMaxima < idadePessoa)
        {
            throw new EmprestimoException("Idade inválida! A idade é maior do que a máxima permitida - Idade Máxima: " + idadeMaxima);
        }
    }

    private void validaSalario(double salarioPessoa) throws EmprestimoException
    {
        if(salarioPessoa < SALARIO_MIN)
        {
            throw new EmprestimoException("Salário inválido! O salário é menor do que o mínimo permitido - Salário Mínimo: " + SALARIO_MIN);
        }
        else if (SALARIO_MAX < salarioPessoa)
        {
            throw new EmprestimoException("Salário inválido! O salário é maior do que o máximo permitido - Salário Máximo: " + SALARIO_MAX);
        }
    }
}
